package com.cccyy.retry;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.remoting.RemoteAccessException;

import java.util.concurrent.atomic.AtomicInteger;

//@Service
public class RetryService {
    private static final Logger log = LoggerFactory.getLogger(RetryService.class);
    private AtomicInteger count = new AtomicInteger(1);

    //在启动类或者配置类 打上注解 @EnableRetry
    //maxAttemptsExpression 重试次数  使用 maxAttemptsExpression 时，通常不需要再设置 maxAttempts 属性，因为 maxAttemptsExpression 会覆盖它
    //value 或 includes：指定哪些异常应该触发重试。
    //* backoff：用于指定重试之间的延迟策略。
    //* stateless：指示重试是否是无状态的。如果为 true，则不会在重试之间保留状态；如果为 false（默认值），则会保留状态。
//    @Retryable(value = {RemoteAccessException.class}, maxAttemptsExpression = "${retry.maxAttempts:10}",
//            backoff = @Backoff(delayExpression = "${retry.backoff:1000}"))
    public void retry() {
        log.info("start to retry : {}", count.getAndIncrement());

        throw new RemoteAccessException("here " + count.get());
    }

//    @Recover
    public void recover(RemoteAccessException t) {
        log.info("SampleRetryService.recover:{}", t.getClass().getName());
    }
}
